#define _CRT_SECURE_NO_WARNINGS
#include"List.h"
//void SLTPrint(SLTNode* head) {
//	SLTNode* cur = head;
//	while (cur) {
//		printf("%d->", cur->data);
//		cur = cur->next;
//	}
//	printf("NULL\n");
//}
//
//SLTNode* BuySListNode(SLTDataType x) {
//	SLTNode* newhead = (SLTNode*)malloc(sizeof(SLTNode));
//	if (newhead == NULL) {
//		perror("malloc failed");
//		exit(-1);
//	}
//	newhead->data = x;
//	newhead->next = NULL;
//	return newhead;
//}
//
//void SLTPushBack(SLTNode** pphead, SLTDataType x) {
//	assert(pphead);
//	SLTNode* newhead = BuySListNode(x);
//	if (*pphead == NULL) {
//		*pphead = newhead;
//		return;
//	}
//	SLTNode* cur = *pphead;
//	while (cur->next) {
//		cur = cur->next;
//	}
//	cur->next = newhead;
//}
//
//void SLTPushFront(SLTNode** pphead, SLTDataType x) {
//	assert(pphead);
//	SLTNode* newhead = BuySListNode(x);
//	newhead->next = *pphead;
//	*pphead = newhead;
//}
//
//void SLTPopBack(SLTNode** pphead) {
//	assert(pphead);
//	assert(*pphead);
//	if ((*pphead)->next == NULL) {
//		free(*pphead);
//		*pphead = NULL;
//	}
//	else {
//		SLTNode* cur = *pphead;
//		while (cur->next->next) {
//			cur = cur->next;
//		}
//		SLTNode* tmp = cur->next;
//		cur->next = NULL;
//		free(tmp);
//	}
//}
//
//
//void SLTPopFront(SLTNode** pphead) {
//	assert(pphead);
//	assert(*pphead);
//	/*SLTNode* tmp = *pphead;
//	*pphead = (*pphead)->next;
//	free(tmp);*/
//	SLTNode* tmp = (*pphead)->next;
//	free(*pphead);
//	*pphead = tmp;
//}
//
//SLTNode* SLTFind(SLTNode* phead,SLTDataType x) {
//	
//	SLTNode* cur = phead;
//	while (cur) {
//		if (cur->data == x) {
//			return cur;
//		}
//		cur = cur->next;
//	}
//	return NULL;
//}
//
//void SLTInsert(SLTNode** pphead, SLTNode*pos,SLTDataType x) {
//	assert(pphead);
//	assert(pos);
//	if (*pphead == pos) {
//		//SLTPushFront(pphead, x);
//		SLTNode* newnode = BuySListNode(x);
//		newnode->next = *pphead;
//		*pphead = newnode;
//	}
//	else {
//		SLTNode* newnode = BuySListNode(x);
//		SLTNode* cur = *pphead;
//		while (cur->next != pos) {
//			cur = cur->next;
//		}
//		newnode->next = cur->next;
//		cur->next = newnode;
//	}
//}
//
//void SLTInsertAfter(SLTNode* pos, SLTDataType x) {
//	assert(pos);
//	SLTNode* newnode = BuySListNode(x);
//	newnode->next = pos->next;
//	pos->next = newnode;
//}
//
//void SLTErase(SLTNode** pphead, SLTNode* pos)
//{
//	assert(pphead);
//	assert(pos);
//	if (pos == *pphead) {
//		//SLTPopFront(pphead);
//		SLTNode* tmp = *pphead;
//		*pphead = (*pphead)->next;
//		free(tmp);
//	}
//	else {
//		SLTNode* cur = *pphead;
//		while (cur->next != pos) {
//			cur = cur->next;
//		}
//		SLTNode* tmp = cur->next;
//		cur->next = cur->next->next;
//		free(tmp);
//	}
//}
//
//void SLTEraseAfter(SLTNode* pos) {
//	assert(pos);
//	SLTNode* tmp = pos->next;
//	pos->next = pos->next->next;
//	free(tmp);
//}
//
//void SLTDestroy(SLTNode** pphead) {
//	assert(pphead);
//	SLTNode* cur = *pphead;
//	while (cur) {
//		SLTNode* tmp = cur;
//		cur = cur->next;
//		free(tmp);
//	}
//	*pphead = NULL;
//}

void SLTPrint(SLTNode* phead) {
	SLTNode* cur = phead;
	while (cur != NULL) {
		printf("%d->", cur->data);
		cur = cur->next;
	}
	printf("NULL\n");

}

SLTNode* BuyListNode(SLTDataType x) {
	SLTNode* newnode = (SLTNode*)malloc(sizeof(SLTNode));
	if (newnode == NULL) {
		perror("malloc failed");
		exit(-1);
}
	newnode->data = x;
	newnode->next = NULL;
	return newnode;
}

void SLTPushBack(SLTNode** pphead, SLTDataType x) {
	assert(pphead);
	SLTNode* newnode = BuyListNode(x);
	if (*pphead == NULL) {
		*pphead = newnode;
	}
	else {
		SLTNode* cur = *pphead;
		while (cur->next != NULL) {
			cur = cur->next;
		}
		cur->next = newnode;
	}
}

void SLTPopBack(SLTNode** pphead) {
	assert(pphead);
	assert(*pphead);
	if ((*pphead)->next == NULL) {
		free(*pphead);
		*pphead = NULL;
	}
	else {
		SLTNode* cur = *pphead;
		while (cur->next->next != NULL) {
			cur = cur->next;
		}
		free(cur->next);
		cur->next = NULL;
	}
}

void SLTPushFront(SLTNode** pphead, SLTDataType x) {
	assert(pphead);
	SLTNode* newnode = BuyListNode(x);
	if (*pphead == NULL) {
		*pphead = newnode;
	}
	else{
		SLTNode* tmp = *pphead;
		*pphead = newnode;
		newnode->next = tmp;
	}
}

void SLTPopFront(SLTNode** pphead) {
	assert(pphead);
	assert(*pphead);
	SLTNode* tmp = (*pphead)->next;
	free(*pphead);
	*pphead = tmp;
}

SLTNode* SLTFind(SLTNode* phead, SLTDataType x) {
	assert(phead);
	SLTNode* cur = phead;
	while (cur != NULL) {
		if (cur->data == x)
			return cur;
		cur = cur->next;
	}
	return NULL;
}


void SLTInsert(SLTNode** pphead, SLTNode* pos, SLTDataType x) {
	assert(pphead);
	assert(*pphead);
	assert(pos);
	SLTNode* newnode = BuyListNode(x);
	if (*pphead == pos) {
		//SLTPushFront(pphead, x);
		newnode->next = pos;
		*pphead = newnode;
	}
	else {
		SLTNode* cur = *pphead;
		while (cur->next != pos) {
			cur = cur->next;
		}
		newnode->next = pos;
		cur->next = newnode;
	}
	
}

void SLTInsertAfter(SLTNode* pos, SLTDataType x) {
	assert(pos);
	SLTNode* newnode = BuyListNode(x);
	SLTNode* tmp = pos->next;
	pos->next = newnode;
	newnode->next = tmp;
}

void SLTErase(SLTNode** pphead, SLTNode* pos) {
	assert(pphead);
	assert(*pphead);
	assert(pos);
	if (*pphead == pos) {
		*pphead = pos->next;
		free(pos);
	}
	else {
		SLTNode* cur = *pphead;
		while (cur->next != pos) {
			cur = cur->next;
		}
		SLTNode* tmp = cur->next;
		cur->next = cur->next->next;
		free(tmp);
	}

}

void SLTEraseAfter(SLTNode* pos) {
	assert(pos);
	assert(pos->next);
	SLTNode* tmp = pos->next;
	pos->next = pos->next->next;
	free(tmp);
}

void SLTDestroy(SLTNode** pphead) {
	assert(pphead);
	SLTNode* cur = *pphead;
	while (cur) {
		SLTNode* tmp = cur;
		cur = cur->next;
		free(tmp);
	}
	*pphead = NULL;
}